Motore di ricerca senza Index Server


Quando il nostro sito web diventa sempre più ricco di informazioni e pagine HTML, può diventare utile indicizzare via database le notizie e i contenuti del sito. Questo espediente semplifica notevolmente le ricerca delle informazioni da parte dell'utente, il quale attraverso un semplice form di ricerca potrà accedere rapidamente alle pagine HTML desiderate.

Certo, è possibile usare lo stesso Index Server per fare questo lavoro, ma in molti casi (sopratutto in caso di sistemi piccoli gestiti in proprio) ed in particolar modo con siti non molto grandi, può essere utile non usare Index Server per risparmiare preziose riserve sul server e metterle a disposizione delle nostre applicazioni ASP.

Per indicizzare il sito serve costruire una tabella sul nostro database, Access per esempio, son una struttura simile:

Struttura Tabella Documenti di Access
Doc_ID Campo numerico valore intero, chiave primaria della tabella rappresenta l'ID del documento da cercare utile per l'impaginazione e la navigazione tra i risultati.
Doc_URL Campo testo del valore di 50 caratteri, indica il percorso del file HTML da cercare, /web/miapagina.html
Titolo Campo testo, del valore di 200 caratteri, contiene il titolo della pagina HTML.
Descrizione Campo testo o memo, è una breve descrizone della pagina HTML e delle informazioni che contiene, rappresenta il campo in cui verrà effettuata la ricerca della parola inserita dall'utente.

Quando inseriamo una nuova pagina web nel nostro sito dobbiamo indicizzarla. Per fare questo sarà necessario inserire il suo titolo, il percorso e una breve descrizione dei contenuti all'interno della tabella Documenti, per il momento a mano, ed il gioco è fatto.
Per fare un buon lavoro nella descrizione dovete tentare di inserire il maggior numero di parole chiave, per rendere la ricerca più precisa e vasta.
Con la seconda parte verrà spiegato come avvantaggiarsi dell'uso dei META TAGS per automatizzare il tutto.
Abbiamo essenzialmete due files, uno contenente il form per la ricerca ricerca.html e uno contenente lo scripts asp per l'interrogazione del database, risultati.asp.


Ecco il codice di ricerca.html:

<form action="risultati.asp" method="post">
<input type="Text" name="StringaDaCercare" size="8" maxlength="20">
<input type="Submit" value="Go">
<input type="Hidden" name="ID" value="0">
<input type="Hidden" name="operatore" value="AND">
</form>


Ecco il codice di risultati.asp:

<!--#include virtual="/scripts/adovbs.inc"-->
<%
'Connessione al database
Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DNS_DATABASE;"

'Setta le preferenze
OperatoreBooleano = Request.form("operatore")
RecordsPerPagina = 5

'Recupera la stringa da ricercare
Dim strRicerca
strRicerca = Request.form("StringaDaCercare")

'Recupera ID del documento da ricercare
ID = Request.Form("ID")

'Definisci l'istruzione SQL
Dim stmSQL, tmpSQL
stmSQL = "SELECT * FROM Documenti WHERE "
tmpSQL = "(Descrizione LIKE "

'Suddividi la stringa da cercare
Dim Pos
Pos = 1
While Pos > 0
Pos = InStr(1, strRicerca," ")
If Pos = 0 Then
'Ho trovato una sola parola nella stringa da ricercare
tmpSQL = tmpSQL & "'%" & strRicerca & "%')"
Else
'Ci sono più parole, quindi concateno le istruzioni LIKE SQL
tmpSQL = tmpSQL & "'%" & Mid(strRicerca,1,Pos) & "%' " & OperatoreBooleano & " Descrizione LIKE "
strRicerca = Mid(strRicerca,Pos+1,len(strRicerca))
End If
Wend

'Costruisco la stringa finale dell'istruzione SQL
stmSQL = stmSQL & tmpSQL & " AND Doc_ID > " & ID
stmSQL = stmSQL & " ORDER BY Doc_ID" 'Importante !

'Genero una variabile per stipare il contenuto della mia interrogazione
Dim rsDocTrovati
Set rsDocTrovati = Server.CreateObject("ADODB.Recordset")

'Prendo solo il numero di risultati massimi per pagina
rsDocTrovati.MaxRecords = RecordsPerPagina

'Setto le propietà del recordsets trovato (include ADOVBS.inc per la definizione delle constanti)
rsDocTrovati.CursorType = adForwardOnly

'Riempio con i valori trovati il mio recordset rsDocTrovati
rsDocTrovati.Open stmSQL, "DNS_DATABASE;"

'Comincio a generare il codice HTML per mostrare i risultati
'Ottengo il numero totale di record trovati dallo statements SQL tmpSQL
Dim rsTotalRecords
stmSQL = "SELECT COUNT(*) FROM Documenti WHERE " & tmpSQL
Set rsTotalRecords = Conn.Execute(stmSQL)

'Verifichiamo quanti risultati massimi possiamo avere
Dim rsMaxID
stmSQL = "SELECT MAX(Doc_ID) FROM Documenti WHERE " & tmpSQL
Set rsMaxID = Conn.Execute(stmSQL)
%>

<table width="100%" border="0" cellspacing="2" cellpadding="0">

<% if rsDocTrovati.EOF then 'Nessuna corrispondenza trovata
%>
<tr><td height="59"></td></tr>
<tr><td align="center" valign="top">
<font size="+1">Nessun articolo o pagina HTML è stata trovata.</font><P>
<A HREF="javascript:history.back(-1)"><font size="+1">Torna alla pagina precedente</font></A>
</td></tr>
<tr><td height="59"></td></tr>
<% Else
Dim IDCorrente
%>

<tr bgcolor="660033">
<td width="30%" align="center"><font color="White"><b>Titolo</b></font></td>
<td align="center"><font color="White"><b>Descrizione
dell'articolo</b></font></td>
</tr>
<tr><td height="10" colspan="2"></td></tr>
<%

While Not rsDocTrovati.EOF
IDCorrente = rsDocTrovati("Doc_ID")
%>
<tr>
<td align="left" valign="top"><A HREF='<%=rsDocTrovati("Doc_URL")%>'>
<font size="2"><%=rsDocTrovati("Titolo")%></font></A></td>
<td><font size="2"><%=rsDocTrovati("Descrizione")%></font></td>
</tr>
<tr><td height="10" colspan="2"></td></tr>
<% rsDocTrovati.MoveNext
Wend %>

<tr bgcolor="660033"><td height="10" colspan="2" align="center">
<% If rsTotalRecords(0)=1 then %>
<b><font color="White">La ricerca sul database ha portato alla luce <b><strong>un
solo</strong></b> documento !!!</font></b>
<% Else %>
<b><font color="white">La ricerca sul database ha portato alla luce <%=rsTotalRecords(0)%> documenti
!!!</b></font>
<% End If %>

</td></tr>
<tr><td height="35" colspan="2"></td></tr>
<tr><td colspan="2" align="center">
<% if IDCorrente < rsMaxID(0) then %>
<!-- Se sono più di 5 documenti produco un tasto per la visualizzazione degli altri documenti -->

<FORM METHOD=POST ACTION='<%= Request.ServerVariables("SCRIPT_NAME") %>'>
<INPUT TYPE=HIDDEN NAME="StringaDaCercare" VALUE='<%=Request.form("StringaDaCercare")%>'>
<input type="Hidden" name="ID" value='<%=IDCorrente%>'>
<INPUT TYPE=SUBMIT VALUE="Successivi Documenti">
</FORM>
<% end if
end if
'Fine dello script
%>

Naturalmente questo è solo il primo passo. In questo articolo è stato solo trattato la costruzione dell'interfaccia del motore di ricerca.

Per approfondimenti su come accedere a database, si consiglia la lettura di questo articolo, con la cui lettura si può arrivare a capire a fondo il codice presente in questo articolo.